
const CheckCode = require('../db').CheckCode
const User = require('../db').User
const jwt = require('jsonwebtoken')

const TOKNE_STR = {
    // token 加密字符串,
    TOKEN_ENCODE_STR: 'itc_token_encode_str',
    PWD_ENCODE_STR: 'itc_pwd_encode_str',
    URL_YES_PASS: [
      '/api/artical/add', //新添文章
      '/api/user/update', // 更新用户
      '/api/tags/add', // 添加标签
      '/api/zan/add', // 点赞
      '/api/comment/add', //评论
      '/api/user/info'
    ],
  }
const { TOKEN_ENCODE_STR, URL_YES_PASS } = TOKNE_STR

module.exports = {
  TOKNE_STR,
  // 生成登录 token
  create_token (str) {
    return jwt.sign({ str }, TOKEN_ENCODE_STR, { expiresIn: '7d' })
  },
  /*
    验证登录 token 是否正确  => 写成中间件
  */
  async check_token (ctx, next) {
    let url = ctx.url
    if (ctx.method === 'POST' && URL_YES_PASS.includes(url)) {
      let token = ctx.get('Authorization')
      if (token === '') {
      // 直接抛出错误
        ctx.status = 200
        ctx.body = {
          code: 401,
          msg: '未登录！',
        }
        return
      }
      try {
      // 验证token是否过期
        let { str = '' } = await jwt.verify(token, TOKEN_ENCODE_STR)
        // 验证token与账号是否匹配
        let res = await User.find({ user_id: str, token })
        if (res.length === 0) {
          ctx.status = 200
          ctx.body = {
            code: 401,
            msg: '登录过期,请重新登录!',
          }
          return
        }
        // 保存用户的_id，便于操作
        ctx._id = res[0]._id
        ctx.name = res[0].user_name
        ctx.avatar = res[0].avatar
        ctx.company = res[0].company&&res[0].company
      } catch (e) {
        ctx.status = 200
        ctx.body = {
          code: 401,
          msg: 'token已经过期了！重新登录',
        }
        return
      }
    }
    await next()
  },
  // 判断验证码
  async check_token_code ({ token, code }) {
    try {
      // 验证码转大写
      code = code.toUpperCase()
      await jwt.verify(token, TOKEN_ENCODE_STR)
      // 读数据库，删除验证码
      let res = await CheckCode.findOneAndDelete({ token, code })
      if (res == null) {
        return false
      }
    } catch (e) {
      return false
    }
    return true
  }
}
